/***************************************************************************************
**  Criado por: Rodrigo Trudelmer (www.trudelmer.com.br)                              **
**  baseado em outros fontes retirados da internet                                    **
**  obrigado ao seus respectivos autores/criadores                                    **
**      http://lucasoliver.wordpress.com/2008/11/03/applet-para-impressao-via-web/    **
**      http://evandropaes.wordpress.com/2009/06/24/criando-arquivos-jar/             **
**      http://javafree.uol.com.br/topic-875000-Impressao-via-Applet.html             **
**      http://www.guj.com.br/posts/list/57965.java                                   **
**  Pelotas - RS                                                                      **
**  27/04/2010                                                                        **
****************************************************************************************/

import java.io.FileOutputStream;
import java.io.PrintWriter;
import javax.swing.JApplet;
import java.util.logging.Level;
import java.util.logging.Logger;

public class phpjpm extends JApplet {

	private String valueArray = null;
	private String text = null;
	private String caracter = null;
	private int command = 0;
	private int ncharleft = 0;
	private int sizefield = 0;
	private int sizefont = 10;
	private int addcl = 0;
	private int addcr = 0;
	private int sizepage = 0;
	private String portprinter = null;
	private String[] ts = null;
	
	/* E_ padrao Epson */
	/* 01 */ final   String E_RESET = "\u001B" + "@";  
	/* 02 */ private String E_TAMANHO_DA_PAGINA = "\u001B" + "C" + (char)33;  /* 1 - 127 */
	/* 03 */ final   String E_TABELA_CARACTERES = "\u001B" + "t" + (char)0;   
	/* 04 */ final   String E_TABELA_CARACTERES_2 = "\u001B" + "(t" + (char)3 + (char)0 + (char)0 + (char)25 + (char)0;  
	/* 05 */ final   String E_FORM_FEED = "\f";  
	/* 06 */ final   String E_NOVA_LINHA = "\n";  
	/* 07 */ final   String E_ALIMENTA_PAGINA = "\u000C";  
	/* 08 */ final   String E_ALINHA_DIREITA = "\u001B" + "a" + (char)0;  
	/* 09 */ final   String E_ALINHA_ESQUERDA = "\u001B" + "a" + (char)1;  
	/* 10 */ final   String E_ALINHA_CENTRO = "\u001B" + "a" + (char)2;  
	/* 11 */ final   String E_ALINHA_TOTAL = "\u001B" + "a" + (char)3;    
	/* 12 */ final   String E_COLUNA_A = "\u001B" + "$" + (char)1;  
	/* 13 */ final   String E_COLUNA_B = "\u001B" + "$" + (char)3;  
	/* 14 */ final   String E_COLUNA_C = "\u001B" + "$" + (char)5;  
	/* 15 */ final   String E_COLUNA_D = "\u001B" + "$" + (char)7; 
	/* 16 */ final   String E_QUALIDADE_RASCUNHO = "\u001B" + "x" + (char)7;
	/* 17 */ final   String E_QUALIDADE_OTIMA = "\u001B" + "x" + (char)7;
	/* 18 */ final   String E_FONTE_ROMAN = "\u001B" + "k" + (char)7;
	/* 19 */ final   String E_FONTE_SS = "\u001B" + "k" + (char)7;
	/* 20 */ final   String E_ESPACAMENTO_EL1 = "\u001B" + "0";
	/* 21 */ final   String E_ESPACAMENTO_EL2 = "\u001B" + "1";
	/* 22 */ private String E_ESPACAMENTO_M1 = "\u001B" + "A" + (char)3;
	/* 23 */ private String E_ESPACAMENTO_M2 = "\u001B" + "3" + (char)10;
	/* 24 */ final   String E_ESPACAMENTO_CANC = "\u001B" + "2";
	/* 25 */ final   String E_QLD_CARTA_ON = "\u001B" + "G";
	/* 26 */ final   String E_QLD_CARTA_OFF = "\u001B" + "H";
	/* 27 */ final   String E_BOLD_ON = "\u001B" + "E";
	/* 28 */ final   String E_BOLD_OFF = "\u001B" + "F";
	
	final String E_TAMANHO_10 = "\u001B" + "!" + (char)0;  
	final String E_TAMANHO_12 = "\u001B" + "M";  
	final String E_TAMANHO_15 = "\u001B" + "g";  
	final String E_TAMANHO_56 = "\u001B" + "!" + (char)56; 
	final String E_TAMANHO_C = "\u001B" + "!" + (char)4;
	final String E_TAMANHO_U = "\u001B" + "!" + (char)128;
	final String E_TAMANHO_I = "\u001B" + "!" + (char)64;
	final String E_TAMANHO_B = "\u001B" + "!" + (char)8;

	public void init() {
		FileOutputStream outputFile = null;
		
		addcl = Integer.parseInt(getParameter("paddcl"));
		addcr = Integer.parseInt(getParameter("paddcr"));
		sizepage = Integer.parseInt(getParameter("psizepage"));
		portprinter = getParameter("pportprinter");
		
		E_TAMANHO_DA_PAGINA = "\u001B" + "C" + (char)sizepage;
		
		valueArray = getParameter("valuePrint");
		ts = valueArray.split("#");

		try {
			outputFile = new FileOutputStream(portprinter); 
			PrintWriter out = new PrintWriter(outputFile);
		
			for(int i=0; i<ts.length; i=(i+6)){
				ncharleft = Integer.parseInt(ts[i]);
				sizefield = Integer.parseInt(ts[i+1]);
				sizefont = Integer.parseInt(ts[i+2]);
				command = Integer.parseInt(ts[i+3]);
				caracter = ts[i+4];
				text = ts[i+5];
				
				ncharleft = ncharleft + addcl;
				sizefield = sizefield + addcr;

					if (command == 1){
						out.print(E_RESET);  
					} else if (command == 2){
						out.print(E_TAMANHO_DA_PAGINA);
					} else if (command == 3){
						out.print(E_TABELA_CARACTERES); 
					} else if (command == 4){
						out.print(E_TABELA_CARACTERES_2); 						
					} else if (command == 7){
						out.print(E_ALIMENTA_PAGINA); 						
					} else if (command == 5){
						out.print(E_FORM_FEED); 						
					} else if (command == 6){
						out.print(E_NOVA_LINHA); 						
					} else if (command == 8){
						out.print(E_ALINHA_DIREITA); 						
					} else if (command == 9){
						out.print(E_ALINHA_ESQUERDA); 						
					} else if (command == 10){
						out.print(E_ALINHA_CENTRO); 						
					} else if (command == 11){
						out.print(E_ALINHA_TOTAL); 						
					} else if (command == 12){
						out.print(E_COLUNA_A); 						
					} else if (command == 13){
						out.print(E_COLUNA_B); 						
					} else if (command == 14){
						out.print(E_COLUNA_C); 						
					} else if (command == 15){
						out.print(E_COLUNA_D); 						
					} else if (command == 16){
						out.print(E_QUALIDADE_RASCUNHO); 						
					} else if (command == 17){
						out.print(E_QUALIDADE_OTIMA); 						
					} else if (command == 18){
						out.print(E_FONTE_ROMAN); 						
					} else if (command == 19){
						out.print(E_FONTE_SS); 						
					} else if (command == 20){
						out.print(E_ESPACAMENTO_EL1); 						
					} else if (command == 21){
						out.print(E_ESPACAMENTO_EL2); 						
					} else if (command == 22){
						E_ESPACAMENTO_M1 = "\u001B" + "A" + (char)ncharleft;
						out.print(E_ESPACAMENTO_M1); 						
					} else if (command == 23){
						E_ESPACAMENTO_M2 = "\u001B" + (char)3 + (char)ncharleft;
						out.print(E_ESPACAMENTO_M2); 						
					} else if (command == 24){
						out.print(E_ESPACAMENTO_CANC); 						
					} else if (command == 25){
						out.print(E_QLD_CARTA_ON); 						
					} else if (command == 26){
						out.print(E_QLD_CARTA_OFF); 						
					} else if (command == 27){
						out.print(E_BOLD_ON); 						
					} else if (command == 28){
						out.print(E_BOLD_OFF); 						
					} else {
						if (sizefont == 12){
							out.print(E_TAMANHO_12);
						} else if (sizefont == 15){
							out.print(E_TAMANHO_15);
						} else if (sizefont == 56){
							out.print(E_TAMANHO_56);
						} else if (sizefont == 91){
							out.print(E_TAMANHO_C);
						} else if (sizefont == 92){
							out.print(E_TAMANHO_U);
						} else if (sizefont == 93){
							out.print(E_TAMANHO_I);
						} else if (sizefont == 94){
							out.print(E_TAMANHO_B);
						} else {
							out.print(E_TAMANHO_10);
						}
						if (text != "ST"){
							for(int e=0; e<ncharleft; e++){
								out.print(caracter);
							}
							if (text.length() > sizefield){
								text.substring(0,sizefield);
							}
							out.print(text);
							if (text.length() < sizefield){
								for(int f=0; f<(sizefield-text.length()); f++){
									out.print(caracter);
								}
							}
						}
					}   
			}
			
			out.close();  
			outputFile.close(); 
		} catch (Exception e) {
			Logger.getLogger(phpjpm.class.getName()).log(Level.SEVERE, null, e);
		}
	}
}